package com.yiruantong.common.redis.config.properties;

import lombok.Data;
import lombok.NoArgsConstructor;
import org.redisson.config.ReadMode;
import org.redisson.config.SubscriptionMode;
import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * Redisson 配置属性
 *
 * @author YiRuanTong
 */
@Data
@ConfigurationProperties(prefix = "redisson")
public class RedissonProperties {

  /**
   * redis缓存key前缀
   */
  private String keyPrefix;

  /**
   * 线程池数量,默认值 = 当前处理核数量 * 2
   */
  private int threads;

  /**
   * Netty线程池数量,默认值 = 当前处理核数量 * 2
   */
  private int nettyThreads;

  /**
   * 单机服务配置
   */
  private SingleServerConfig singleServerConfig;

  /**
   * 集群服务配置
   */
  private ClusterServersConfig clusterServersConfig;

  @Data
  @NoArgsConstructor
  public static class SingleServerConfig {

    /**
     * 客户端名称
     */
    private String clientName;

    /**
     * 最小空闲连接数
     */
    private int connectionMinimumIdleSize;

    /**
     * 连接池大小
     */
    private int connectionPoolSize;

    /**
     * 连接空闲超时，单位：毫秒
     */
    private int idleConnectionTimeout;

    /**
     * 命令等待超时，单位：毫秒
     */
    private int timeout;

    /**
     * 发布和订阅连接池大小
     */
    private int subscriptionConnectionPoolSize;

  }

  @Data
  @NoArgsConstructor
  public static class ClusterServersConfig {

    /**
     * 客户端名称
     */
    private String clientName;

    /**
     * master最小空闲连接数
     */
    private int masterConnectionMinimumIdleSize;

    /**
     * master连接池大小
     */
    private int masterConnectionPoolSize;

    /**
     * slave最小空闲连接数
     */
    private int slaveConnectionMinimumIdleSize;

    /**
     * slave连接池大小
     */
    private int slaveConnectionPoolSize;

    /**
     * 连接空闲超时，单位：毫秒
     */
    private int idleConnectionTimeout;

    /**
     * 命令等待超时，单位：毫秒
     */
    private int timeout;

    /**
     * 发布和订阅连接池大小
     */
    private int subscriptionConnectionPoolSize;

    /**
     * 读取模式
     */
    private ReadMode readMode;

    /**
     * 订阅模式
     */
    private SubscriptionMode subscriptionMode;

  }

}
